/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package zonasoft.Manejadores;

import java.lang.Object;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import zonasoft.Conceptos.Lider;
import zonasoft.Conceptos.Zonificados;

/**
 *
 * @author Usuario
 */
public class ManejadorZonificados {

//  public static Timestamp fechaCreacion;
//  public static Timestamp fechaNacimiento;
    public static Connection con;
    public static Connection conm;

    public static Zonificados getZonificados(String idZonificados) throws SQLException {
        if (idZonificados == null) {
            throw new SQLException("no hay elemento clave en la clase puesto");
        }
        ResultSet rs = null;
        PreparedStatement pst = null;
        Zonificados zonificados = null;
        try {
//     pst = con.prepareStatement(" SELECT * FROM zonificados z, lider l WHERE z.idlider = ? && l.idlider = z.idlider");
            pst = con.prepareStatement(" SELECT lider.idlider, lider.nombre AS lider FROM zonificacion.zonificados INNER JOIN zonificacion.lider ON (zonificados.idlider = lider.idlider) where zonificados.idzonificados =?");
            pst.setString(1, idZonificados.trim());
            rs = pst.executeQuery();
            while (rs.next()) {
                zonificados = Zonificados.load(rs);
            }
        } finally {
            if (rs != null) {
//                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return zonificados;
        }
    }

//    public static liderbyZonficados (String idZonificado){
//      if (idZonificados == null) {
//            try {
//                throw new SQLException("no hay elemento clave en la clase puesto");
//            } catch (SQLException ex) {
//                Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
//                ex.printStackTrace();
//            }
//        }
//        ResultSet rs = null;
//        PreparedStatement pst = null;
//        Lider lider = null;
//
//        rs=null;
//            System.out.println("rs" + rs);
//            pst=con.prepareStatement("SELECT   " +
//                    "    lider.nombre" +
//                    "    , lider.apellido" +
//                    "    , zonificados.nombre" +
//                    "    , zonificados.apellido" +
//                    "    , zonificados.idzonificados" +
//                    "FROM" +
//                    "    zonificacion.zonificados" +
//                    "    INNER JOIN zonificacion.lider " +
//                    "        ON (zonificados.idlider = lider.idlider)" +
//                    "WHERE (zonificados.idzonificados = ?)");
//
//           try{
//            pst.setString(1, idZonificados.trim());
//            rs=pst.executeQuery();
//            if(rs!=null)
//            {
//             while(rs.next())
//             {
//              Lider lider = new Lider();
//              lider.setNombre(rs.getString(2));
//              }
//            }catch(Exception e){
//
//             }
//            }
//            return lider;
//    }
    public static Zonificados getZonificadosPropio(String idZonificados) {
        if (idZonificados == null) {
            try {
                throw new SQLException("no hay elemento clave en la clase puesto");
            } catch (SQLException ex) {
                Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        }
//        System.out.println("idZonificados = " + idZonificados);
        ResultSet rs = null;
        PreparedStatement pst = null;
        Zonificados zonificados = null;
        try {
            pst = con.prepareStatement("select * from zonificados where idzonificados =?");
            pst.setString(1, idZonificados.trim());
            rs = pst.executeQuery();

            while (rs.next()) {
                zonificados = Zonificados.load(rs);
            }

            pst=con.prepareStatement("SELECT CONCAT(c.nombre, ' ',c.apellido) AS candidato FROM candidato_zonificado AS cz, candidato AS c,zonificados AS z WHERE z.idzonificados = ? AND cz.id_candidato=c.idcandidato AND cz.id_zonificado=z.idzonificados");
            pst.setString(1, idZonificados);
            rs=pst.executeQuery();

            List<String> candidatos=new ArrayList<String>();
            if(rs.next())
            {
                String candidato=rs.getString(1);
                candidatos.add(candidato);
                zonificados.setIdCandidatos(candidatos);
            }


//   System.out.print(zonificados + "el de get");
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
//                rs.close();
            }
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return zonificados;
        }
    }

    public static Lider liderByZonificado(String idZonificados) {
        if (idZonificados == null) {
            try {
                throw new SQLException(" No hay elemento clave en la clase zonificado");
            } catch (SQLException ex) {
                Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        }
        ResultSet rs = null;
        PreparedStatement pst = null;
        Lider lider = null;
        try {
//            pst = con.prepareStatement("SELECT   "
//                    + "    lider.nombre"
//                    + "    , lider.apellido"
//                    + "    , zonificados.nombre"
//                    + "    , zonificados.apellido"
//                    + "    , zonificados.idzonificados"
//                    + "FROM"
//                    + "   zonificados"
//                    + "    INNER JOIN lider "
//                    + "        ON (zonificados.idlider = lider.idlider)"
//                    + "WHERE (zonificados.idzonificados = ?)");
            pst = con.prepareStatement("SELECT    lider.idlider, lider.nombre, lider.apellido  FROM zonificados  INNER JOIN lider  ON (zonificados.idlider = lider.idlider)WHERE (zonificados.idzonificados =?);");
            pst.setString(1, idZonificados.trim());
            rs = pst.executeQuery();
            while (rs.next()) {
                lider = Lider.load2(rs);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
//                rs.close();
            }
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return lider;
        }
    }


    private static List listaZonificados;

    public static List getZonificados() {
        return listaZonificados;
    }

    public static List listarZonificados() throws SQLException, Exception {
        ResultSet rs = null;
        PreparedStatement pst = null;
        listaZonificados = new LinkedList();
        try {
            pst = con.prepareStatement("select z.idzonificados, z.nombre, z.apellido,z.telefono, p.nombre, z.mesa from zonificados z, puestodevotacion p where z.idpuesto_votacion = p.idpuesto_votacion");

            rs = pst.executeQuery();
            while (rs.next()) {
                listaZonificados.add(Zonificados.load2(rs));
            }
//            System.out.println(listaZonificados.size());
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return listaZonificados;
        }
    }

    public static Map<String, String> getDatosVotacion(String idPuesto) throws SQLException, Exception {
        ResultSet rs = null;
        PreparedStatement pst = null;
        Map<String, String> resultado = new HashMap<String, String>();
        try {
            pst = con.prepareStatement("SELECT puestodevotacion.nombre as 'puesto'"
                    + " , barrio.nombre as 'barrio'"
                    + " , municipios.nombre as 'municipio'"
                    + " , departamentos.nombre as 'departamento'"
                    + "FROM "
                    + " zonificacion.puestodevotacion "
                    + " INNER JOIN zonificacion.barrio "
                    + " ON (puestodevotacion.idbarrio = barrio.idBarrio) "
                    + " INNER JOIN zonificacion.zona "
                    + " ON (puestodevotacion.idZona = zona.codigo) "
                    + " INNER JOIN zonificacion.municipios "
                    + " ON (zona.idmunicipio = municipios.codigo) "
                    + " INNER JOIN zonificacion.departamentos "
                    + "  ON (municipios.cod_departamentos = departamentos.codigo) "
                    + "WHERE puestodevotacion.idpuesto_votacion = ? ");
            pst.setString(1, idPuesto);

            rs = pst.executeQuery();
            while (rs.next()) {
                resultado.put("puesto", rs.getString(1));
                resultado.put("barrio", rs.getString(2));
                resultado.put("municipio", rs.getString(3));
                resultado.put("departamento", rs.getString(4));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultado;
        }
    }

// fin del metodo
    /**
     *
     * @param zo
     * @param idZon
     */
    public static void crearZonificado(Zonificados zo) throws SQLException {

        if (con == null) {
            throw new SQLException("no hay conexion");
        }
        PreparedStatement pst = null;
        try {
            pst = con.prepareStatement("insert into zonificados values(?,null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            pst.setString(1, zo.getIdZonificado());
            //      pst.setString(2, "");
            pst.setString(2, zo.getIdLider());
            pst.setString(3, zo.getIdPuesto());
            pst.setString(4, zo.getNombres());
            pst.setString(5, zo.getApellidos());
            java.sql.Date fechaN = new java.sql.Date(zo.getFechadeNacimiento().getTime());
            pst.setDate(6, fechaN);
            pst.setString(7, zo.getCorreo());
            pst.setString(8, zo.getTelefono());
            pst.setString(9, zo.getIdBarrio());
            pst.setString(10, zo.getDireccion());
            pst.setString(11, zo.getCargo());
            pst.setString(12, zo.getNumeroMesa());
            pst.setInt(13, zo.getSexo());
            pst.setString(14, zo.getCodHoja());
            java.sql.Date fechaC = new java.sql.Date(zo.getFechadeCreacion().getTime());
            pst.setDate(15, fechaC);
            pst.setString(16, zo.getIdUsuario());
            pst.setString(17, zo.getComite());
            pst.executeUpdate();


            for (String ca : zo.getIdCandidatos()) {
                if(!ca.equals("0"))
                {
                 pst = con.prepareStatement("insert into candidato_zonificado values (null,?,?)");
                 pst.setInt(1, Integer.parseInt(ca));
                 pst.setInt(2,Integer.parseInt(zo.getIdZonificado()));
                    pst.executeUpdate();
                }
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
    }

    public static Object[] validarZonificacion(String b1, String b2) throws SQLException, Exception {
        ResultSet rs = null;
        PreparedStatement pst = null;
        boolean respuesta = false;
        Object[] resultado = new Object[3];
        int[] unidades = new int[2];
        Map<String, Integer> unidadesMap = new HashMap<String, Integer>();
        b1=(b1!=null && !b1.isEmpty())?b1:"barrio1";//operador ternario
        b2=(b2!=null && !b2.isEmpty())?b2:"barrio2";//operador ternario
        try {

            if (!b1.trim().equals(b2.trim())) {
                pst = con.prepareStatement("SELECT udegobierno.codigo,barrio.nombre "
                        + " FROM zonificacion.barrio"
                        + " INNER JOIN zonificacion.udegobierno "
                        + " ON (barrio.iducdg = udegobierno.codigo) "
                        + " where barrio.nombre= ? OR barrio.nombre= ? ");
                pst.setString(1, b1.trim());
                pst.setString(2, b2.trim());
                rs = pst.executeQuery();
                int i = 0;
                while (rs.next()) {
                    resultado[i] = rs.getInt(1);
                    unidadesMap.put(rs.getString(2).toLowerCase(), rs.getInt(1));
                    unidades[i] = rs.getInt(1);
                    i++;
                }
//                System.out.println(unidades[0] + " = " + unidades[1]);
                if (unidades[0] != unidades[1]) {
                    respuesta = false;
                } else {
                    respuesta = true;
                }
                resultado[0] = unidadesMap;
                resultado[1] = respuesta;
                resultado[2] = 0;
            } else {
                pst = con.prepareStatement("SELECT udegobierno.codigo,barrio.nombre "
                        + " FROM zonificacion.barrio"
                        + " INNER JOIN zonificacion.udegobierno "
                        + " ON (barrio.iducdg = udegobierno.codigo) "
                        + " where barrio.nombre= ?  ");
                pst.setString(1, b1.trim());
                rs = pst.executeQuery();
                respuesta = true;
                resultado[0] = new HashMap<String, Integer>();
                resultado[1] = respuesta;
                while (rs.next()) {
                    resultado[2] = rs.getInt(1);
                }

//                System.out.println("resultado[2] = " + resultado[2]);

            }


        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultado;
        }
    }

    public static boolean ModificarZonificado(Zonificados zon, String idZonificad) throws SQLException {
        if (getZonificadosPropio(idZonificad) == null) {
            throw new SQLException("zonificado registrada");
        }
        PreparedStatement pst = null;
        boolean res = false;
        try {
////            pst = con.prepareCall("update zonificados set idzonificados =?, codigo=?, idlider=?, idpuesto_votacion =?," +
//                               "nombre =?, fechadenacimiento=?,correo=?, telefono=?, barrio=?,direccion=?, cargo=?,mesa=?,sexo=?");
// UPDATE `zonificacion`.`zonificados` SET `nombre` = 'oscar',`apellido` = 'Acantar' WHERE `zonificados`.`idzonificados` =14789;            
 //UPDATE `zonificacion`.`zonificados` SET `nombre` = 'pedro',`apellido` = 'Alcantar' WHERE `zonificados`.`codigo` =2;
   //      pst.setString(2, zon.getCodigo());
//idzonificados - codigo* -idlider* - idpuesto_votacion - nombre* - apellido* - fechadenacimiento* - correo* - telefono* - barrio- direccion- cargo*- mesa-
            //sexo- codHoja- fechaCreacion-idUsuario
            pst = con.prepareCall("update zonificados set idlider=?, "
                    + "nombre=?, apellido=?, fechadenacimiento = ?, cargo=?, "
                    + "telefono=?, correo=?,codHoja=? , direccion=?, barrio=?, idzonificados= ?, sexo = ?,mesa=?,idpuesto_votacion = ?,comite = ? where idzonificados=?");
            pst.setString(1, zon.getIdLider());
            //pst.setString(2, zon.getCodigo());
            pst.setString(2, zon.getNombres());
            pst.setString(3, zon.getApellidos());

            java.sql.Date fechaNacimiento = new java.sql.Date(zon.getFechadeNacimiento().getTime());
            pst.setDate(4, fechaNacimiento);
            pst.setString(5, zon.getCargo());
            pst.setString(6, zon.getTelefono());
             pst.setString(7, zon.getCorreo());
             pst.setString(8, zon.getCodHoja());
              pst.setString(9, zon.getDireccion());
              pst.setString(10, zon.getIdBarrio());
              pst.setString(11, zon.getIdZonificado());
//              int sex = Integer.parseInt(zon.getSexo());
              pst.setInt(12, zon.getSexo());
              int mesa = Integer.parseInt(zon.getNumeroMesa());
              pst.setInt(13, mesa);
              pst.setString(14, zon.getIdPuesto());
              pst.setString(15, zon.getComite());
              pst.setString(16, idZonificad);

               for (String ca : zon.getIdCandidatos()) {
                if(!ca.equals("0"))
                {
                 pst = con.prepareStatement("update candidato_zonificado set  id_zonificado= ?,id_candidato = ? where id_zonificado=?");
                 pst.setInt(2, Integer.parseInt(ca));
                 pst.setInt(1,Integer.parseInt(zon.getIdZonificado()));
                 pst.setInt(3, Integer.parseInt(zon.getIdZonificado()));
                    pst.executeUpdate();
                }
            }
             
// pst.setDate(6,zon.getFechadeNacimiento());            
//            pst.setString(12,zon.getNumeroMesa() );
//            pst.setString(13,zon.getSexo());
            //            pst.setString(15, zon.getFechadeCreacion());

//            System.out.println("res = " + res);
//            System.out.println("pst = " + pst);
            int r = pst.executeUpdate();
            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;

    }// fin de la clase

    public static boolean deleteZonificado(String id) throws SQLException {
        if (getZonificadosPropio(id) == null) {
            throw new SQLException("no hay elemento clave de la clase zonificado");
        }
        PreparedStatement pst = null;
        boolean res = false;
        try {
            pst = conm.prepareStatement("delete from zonificados where idzonificados = ?");
            pst.setString(1, id.trim());
            int r = pst.executeUpdate();
            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;
    }

 public static int cantidadZonificados() throws SQLException{
   PreparedStatement pst = null;
   ResultSet rs = null;
   int numeroZonificados = 0;
   
   String consulta= ("Select count(*) from zonificados");
        try {
            pst = con.prepareStatement(consulta);
            rs = pst.executeQuery();
            while(rs.next()){
            numeroZonificados = rs.getInt(1);
            }
        }
//        catch (SQLException ex) {
//            Logger.getLogger(ManejadorZonificados.class.getName()).log(Level.SEVERE, null, ex);
//        }
   finally{
          if( pst!=null){
              pst.close();
          }
          if(rs !=null){
          rs.close();
          }

        }
   return numeroZonificados;
   
    
  }

public static boolean guardarNovedad(String idZonificado,String idlideractual,String idlidernuevo,int tipo,String descripcion) throws SQLException {
//        if (getZonificadosPropio(idZonificad) == null) {
//            throw new SQLException("novedad registrada");
//        }
        int r=-1;
         if (con == null) {
            throw new SQLException("no hay conexion");
        }
        PreparedStatement pst = null;
        try {
            pst = con.prepareStatement("insert into novedad values(null,?,?,?,null,?,?)");
            pst.setString(1, idZonificado);
            pst.setString(2, idlideractual);
            pst.setString(3, idlidernuevo);
            pst.setInt(4, tipo);
            pst.setString(5, descripcion);
            r=pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        if(r!=0)
            return true;
        else
            return false;

    }// fin de la clase

public static boolean guardarModificacion() throws SQLException{
  int r=-1;
         if (con == null) {
            throw new SQLException("no hay conexion");
        }
        PreparedStatement pst = null;
    try{
       pst = con.prepareStatement("insert into novedad values");
       
       
       r=pst.executeUpdate();
  } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        if(r!=0)
            return true;
        else
            return false;
}


//Statement stmt = null;
//try{
//con.setAutoCommit(false);
//stmt =  (Statement) con.createStatement();
//System.out.print(zo.getFechadeCreacion().toString());
//System.out.print(zo.getFechadeNacimiento().toString());
//stmt.addBatch("INSERT INTO zonificados values ("+zo.getIdZonificado()+",null,"+zo.getIdLider()+"','"+zo.getIdPuesto()+",'"+zo.getNombres()+"','"+zo.getApellidos()+"',"+zo.getFechadeNacimiento()+",'"+zo.getCorreo()+"','"+zo.getTelefono()+"','"+zo.getDireccion()+"','"+zo.getCargo()+"','"+zo.getNumeroMesa()+"','"+zo.getSexo()+"','"+zo.getCodHoja()+"','"+zo.getFechadeCreacion()+"','"+zo.getIdUsuario()+"')");
//
//stmt.executeBatch();
//con.commit();
//}finally{
//  if(stmt != null){
//  stmt.close();
//   }
//  }
    // metodo en smtp
} //fin de la clase

